# 文件: notes.py
# 描述: 提供与笔记相关的API端点，包括创建、获取、更新、删除和搜索笔记。

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from app.services.note_service import NoteService
from app.schemas import NoteSchema
from marshmallow import ValidationError

notes_bp = Blueprint('notes', __name__)
note_schema = NoteSchema()

@notes_bp.route('/notes', methods=['POST'])
@jwt_required()  # 需要 JWT 认证
def create_note():
    try:
        user_id = get_jwt_identity()
        data = note_schema.load(request.get_json())
        
        note = NoteService.create_note(
            user_id=user_id,
            content=data['content'],
            ai_response=data.get('ai_response'),
            ai_style=data.get('ai_style')
        )
        
        return jsonify(note.to_dict()), 201  # 返回创建的笔记数据和 201 状态码
        
    except ValidationError as err:
        # 如果数据验证失败，返回验证错误信息和 400 状态码
        return jsonify({'error': 'Validation error', 'messages': err.messages}), 400
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500

@notes_bp.route('/notes', methods=['GET'])
@jwt_required()  # 需要 JWT 认证
def get_notes():
    try:
        user_id = get_jwt_identity()  # 从 JWT 中获取用户 ID
        notes = NoteService.get_user_notes(user_id)  # 获取用户的所有笔记
        return jsonify([note.to_dict() for note in notes]), 200  # 返回笔记列表和 200 状态码
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500

@notes_bp.route('/notes/<int:note_id>', methods=['GET'])
@jwt_required()  # 需要 JWT 认证
def get_note(note_id):
    try:
        user_id = get_jwt_identity()  # 从 JWT 中获取用户 ID
        note = NoteService.get_note(user_id, note_id)  # 获取指定 ID 的笔记
        
        if not note:
            # 如果笔记不存在，返回 404 错误信息和 404 状态码
            return jsonify({'error': 'Note not found'}), 404
            
        return jsonify(note.to_dict()), 200  # 返回笔记数据和 200 状态码
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500

@notes_bp.route('/notes/<int:note_id>', methods=['PUT'])
@jwt_required()  # 需要 JWT 认证
def update_note(note_id):
    try:
        user_id = get_jwt_identity()  # 从 JWT 中获取用户 ID
        note = NoteService.get_note(user_id, note_id)  # 获取指定 ID 的笔记
        
        if not note:
            # 如果笔记不存在，返回 404 错误信息和 404 状态码
            return jsonify({'error': 'Note not found'}), 404
            
        data = note_schema.load(request.get_json())  # 验证并解析请求体中的 JSON 数据
        note = NoteService.update_note(
            note, 
            data['content'],
            ai_response=data.get('ai_response'),
            ai_style=data.get('ai_style')
        )  # 更新笔记数据
        
        return jsonify(note.to_dict()), 200  # 返回更新后的笔记数据和 200 状态码
    except ValidationError as err:
        # 如果数据验证失败，返回验证错误信息和 400 状态码
        return jsonify({'error': 'Validation error', 'messages': err.messages}), 400
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500

@notes_bp.route('/notes/<int:note_id>', methods=['DELETE'])
@jwt_required()  # 需要 JWT 认证
def delete_note(note_id):
    try:
        user_id = get_jwt_identity()  # 从 JWT 中获取用户 ID
        note = NoteService.get_note(user_id, note_id)  # 获取指定 ID 的笔记
        
        if not note:
            # 如果笔记不存在，返回 404 错误信息和 404 状态码
            return jsonify({'error': 'Note not found'}), 404
            
        NoteService.delete_note(note)  # 删除笔记
        return jsonify({'message': 'Note deleted successfully'}), 200  # 返回删除成功的信息和 200 状态码
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500

# 搜索部分
@notes_bp.route('/notes/search', methods=['GET'])
@jwt_required()  # 需要 JWT 认证
def search_notes():
    try:
        user_id = get_jwt_identity()
        keyword = request.args.get('keyword', '')
        notes = NoteService.search_notes(user_id, keyword)
        return jsonify([note.to_dict() for note in notes]), 200
    except Exception:
        # 如果发生其他异常，返回内部服务器错误信息和 500 状态码
        return jsonify({'error': 'Internal server error'}), 500